package com.study.example.ex01;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;

/**
* @Name: DirCopyDemo
* @Description: 目录复制
* 说明：
* 	目录复制：复制指定目录下所有的文件和目录到目标文件夹
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-16 下午1:28:54 
* @Version: V1.0
 */
public class DirCopyDemo {
	
	/**
	* @Name: dirCopy
	* @Description: 目录复制：复制指定目录下所有的文件和目录到目标文件夹
		 * 思路：
		 * 	1、获取源目录File对象
		 * 	2、获取目标目录File对象
		 * 	3、如果目标目录不存在，则创建；
		 * 	4、获取源目录下所有文件及目录的File对象数组
		 * 	5、遍历数组中每一个File对象元素
		 * 		判断：
		 * 			如果File元素为文件，拷贝到目标目录；
		 * 			如果File元素为目录，设置该目录为源目录，目标目录为target+目标目录名称，进行递归操作；
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 下午1:31:39
	* @Parameters: @param original 源目录
	* @Parameters: @param target 目标目录
	* @Parameters: @throws IOException
	* @Return: void
	 */
	public void dirCopy(String original, String target) throws IOException {
		//获取源目录File对象
		File oDir = new File(original) ;
		//获取目标目录File对象
		File tDir = new File(target) ;
		//如果目标目录不存在，则创建
		if(!tDir.exists()) {
			tDir.mkdirs() ;
		}
		//获取源目录下所有文件及目录的File对象数组
		File[] oDirFileList = oDir.listFiles() ;
		//遍历数组中每一个File对象元素
		for (File oFile : oDirFileList) {
			//判断，如果File元素为文件
			if(oFile.isFile()) {
				//拷贝到目标目录
				String oFilePath = oFile.getAbsolutePath() ;
				String oFileName = oFile.getName() ;
				String tFilePath = target + "\\" + oFileName ;
				fileCopy(oFilePath, tFilePath) ;
			} else { //如果File元素为目录
				//设置该目录为源目录，目标目录为target+目标目录名称，进行递归操作
				String oDirPath = oFile.getAbsolutePath() ;
				String oDirName = oFile.getName() ;
				String tDirPath = target + "\\" + oDirName ;
				dirCopy(oDirPath, tDirPath) ;
			}
		}
	}
	
	/**
	* @Name: fileCopy
	* @Description: 文件拷贝
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 下午1:41:20
	* @Parameters: @param oFilePath 源文件路径（包括文件名）
	* @Parameters: @param tFilePath 目标文件路径（包括文件名）
	* @Return: void 无
	 */
	public void fileCopy(String oFilePath, String tFilePath) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(oFilePath)) ;
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tFilePath)) ;
		//读取数据，一次读取一个字节数组
		byte[] buf = new byte[1024] ;
		int len = 0 ;
		//复制文件内容
		while((len = bis.read(buf)) != -1) {
			bos.write(buf, 0, len) ;
			bos.flush() ;
		}
		//释放资源
		bis.close() ;
		bos.close() ;
	}
	
	@Test
	public void test() {
		String oDirPath = "D:\\demo" ;
		String tDirPath = "D:\\test" ;
		try {
			dirCopy(oDirPath, tDirPath) ;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}


















